{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pickle\n",
    "from pathlib import Path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from google.protobuf import text_format\n",
    "from second.utils import simplevis\n",
    "from second.pytorch.train import build_network\n",
    "from second.protos import pipeline_pb2\n",
    "from second.utils import config_tool"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Read Config file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "config_path = \"/home/yy/deeplearning/deeplearning/mypackages/second/configs/car.lite.nb.config\"\n",
    "config = pipeline_pb2.TrainEvalPipelineConfig()\n",
    "with open(config_path, \"r\") as f:\n",
    "    proto_str = f.read()\n",
    "    text_format.Merge(proto_str, config)\n",
    "input_cfg = config.eval_input_reader\n",
    "model_cfg = config.model.second\n",
    "config_tool.change_detection_range(model_cfg, [-50, -50, 50, 50])\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "# device = torch.device(\"cpu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build Network, Target Assigner and Voxel Generator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  41 2000 2000]\n"
     ]
    }
   ],
   "source": [
    "ckpt_path = \"/home/yy/pretrained_models_v1.5/car_lite/voxelnet-15500.tckpt\"\n",
    "net = build_network(model_cfg).to(device).eval()\n",
    "net.load_state_dict(torch.load(ckpt_path))\n",
    "target_assigner = net.target_assigner\n",
    "voxel_generator = net.voxel_generator"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Generate Anchors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "grid_size = voxel_generator.grid_size\n",
    "feature_map_size = grid_size[:2] // config_tool.get_downsample_factor(model_cfg)\n",
    "feature_map_size = [*feature_map_size, 1][::-1]\n",
    "\n",
    "anchors = target_assigner.generate_anchors(feature_map_size)[\"anchors\"]\n",
    "anchors = torch.tensor(anchors, dtype=torch.float32, device=device)\n",
    "anchors = anchors.view(1, -1, 7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Read KITTI infos\n",
    "you can load your custom point cloud."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "info_path = input_cfg.dataset.kitti_info_path\n",
    "root_path = Path(input_cfg.dataset.kitti_root_path)\n",
    "with open(info_path, 'rb') as f:\n",
    "    infos = pickle.load(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Point Cloud, Generate Voxels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(84129, 5, 4)\n"
     ]
    }
   ],
   "source": [
    "info = infos[564]\n",
    "v_path = info[\"point_cloud\"]['velodyne_path']\n",
    "v_path = str(root_path / v_path)\n",
    "points = np.fromfile(\n",
    "    v_path, dtype=np.float32, count=-1).reshape([-1, 4])\n",
    "voxels, coords, num_points = voxel_generator.generate(points, max_voxels=90000)\n",
    "print(voxels.shape)\n",
    "# add batch idx to coords\n",
    "coords = np.pad(coords, ((0, 0), (1, 0)), mode='constant', constant_values=0)\n",
    "voxels = torch.tensor(voxels, dtype=torch.float32, device=device)\n",
    "coords = torch.tensor(coords, dtype=torch.int32, device=device)\n",
    "num_points = torch.tensor(num_points, dtype=torch.int32, device=device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Detection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "example = {\n",
    "    \"anchors\": anchors,\n",
    "    \"voxels\": voxels,\n",
    "    \"num_points\": num_points,\n",
    "    \"coordinates\": coords,\n",
    "}\n",
    "pred = net(example)[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Simple Vis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "boxes_lidar = pred[\"box3d_lidar\"].detach().cpu().numpy()\n",
    "vis_voxel_size = [0.1, 0.1, 0.1]\n",
    "vis_point_range = [-50, -30, -3, 50, 30, 1]\n",
    "bev_map = simplevis.point_to_vis_bev(points, vis_voxel_size, vis_point_range)\n",
    "bev_map = simplevis.draw_box_in_bev(bev_map, vis_point_range, boxes_lidar, [0, 255, 0], 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f5b52cc5550>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAADsCAYAAACWscopAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJztXXl8FEXafioJhxcqrOyyXogHiMp9yYKycoQchCMh3CQh4b7vQEDuGyECcqkEFEQI8AELKCILH/q5gIpcHqgociPLfYYk835/TFenu6d7pmem50imnvk9v6murq6qrumpt+t9q95iRAQBAQEBgdBGWKArICAgICAQeAhhICAgICAghIGAgICAgBAGAgICAgIQwkBAQEBAAEIYCAgICAjAR8KAMdacMXaMMfYrYyzdF2UICAgICFgHZvU6A8ZYOICfATQFcBrA1wA6ENEPlhYkICAgIGAZfDEyqAPgVyL6jYjuAfgYQEsflCMgICAgYBF8IQweB3BKcXxaihMQEBAQCFJE+CBPphPnoItijPUA0EM6rOmDeggICPgRTzzxBE6fPm3/N3+rk8AovihB2ZOZvVfv2uW/RPSYx1cr4IuRwWkATyqOnwBwVpuIiJYSUS0iquWDOggIBD1GjBhhST5jx461JB9vcfr0acyZMwf4xiCBUXxRwrcKunON56bbPzy+UgsispSwjzZ+A/AMgOIADgF4ycU1JCjoK164cCHgdXDGESNGBLwOAGjq1KnW5OXNJwjawe/07t6/sazvtloYSJ17NOwzio4DyDCRPvA/iGCR5b59+wJeB1ccOXKk13m8+eabAb8PAAQCZWdn68a7ui7gdfdT+6g+3uVnmTDwhc0ARLQNwDZf5C0g4C4uXLigGz9o0CA5nJmZ6XU5gwYN8jifGTNmeF3+xIkTvc5DwAcgzbGeVTUY4IuRgQcjicBLa8Eiy8IwMrCS48aNC2wdpLfdOXPm6Ma7uq5I0H+qL8tGBpYvOvMEjLHAV0JAQMAaEJC9Lhtt27Z1iHf6VuzqvIAeviWLJuEI30QCRR75+fkBK3vIkCFeXZ+eLry5CPgJgVYRCTWRoK957ty5gNdhyJAhASl3/Pjx/i/X008QPCuFkME9m0gIA8FgYl5eXsDrwDl06FCPrx01apRH13krEKZPnx7wdhM0pBAGgoJmGXCDqobeCIRAUQiEoKUwIAsImMWhQ4dQtWrVQFfDFA4fPowqVaoEuhoChQfCgCwgYBYVKlRAv379ZAYzqlSpYtq9xOjRo93Ke8KECZ5UqXBB+c4s4BbEyECgyOPs2bP4+9//bkleAwYM0I2fN2+eJfl7gtGjR2Pq1Kmm0k6YMAHjxo2ztgKEwE8JVfYgDMFRJ//AspFBwO0FwmYg6Gveu3cv4HUwQ298FGVkZJhOO3HiRK/qOWPGDMd4Mx9ftZ1R/r4sM3goDMiCgma5a9eugJQ7cOBAj67zVCj4UyB4RKsFhKs8fC2EgoNCGAgKmuWhQ4cCXgdP6IlQGDNmjN/qpztCcIeedtTuCBMhDIQwEBTkvHv3bsDr4Cmt8GbqjD5RGbnge++9Zw876agd/BpxuvO2L0YGQhgICioZKDWRHgcPHuzRdb4UCpMmTfLqeo9HCO521EII6FGsMxAQMIvTp09j2rRpeOedd9C3b18w5nqaCU8zf/58n9RpyJAh9l3B3EB6ejqmT5/uk/pMmjTJsx3TpH/uvv37ULduXfev9WDGz+zZszFs2DDDuoTILCIOMZtIUNAsdTda8QH79+/vVvpA+SsyolcjBBefkydP0smTJ+ny5ct0+fJlAoEuX75Mp06dsqb+oTUaUFKoiQQFzfL27dt+Lc9doVBUOHPmTOPzeh8ryg1dIcAphIGgoFn+8ssvASl3wIABbqUvjD6LtHQqEKykEAKcQhgICpqlZaqIIKRZT6bu7I88efJkr+rkF4EgBAGnEAaCgmYZLOsMBg0aZDrtsGHDTKf1hUAQLDQUwkBQ0Cxv3rwZ8DooaVYouCMQfEFvRgh+UxcJiqmlAgJmcePGDTz00EOBroYDBg8ejLlz5wa6GgKFG8KFtYCAWXzwwQeW5KN0g62lJ5g7dy4GDx5sKu3w4cNNpTPr1todz6WTJ082nVaJmTNnenSdQIAQaBWRUBMJusuJEyfqztHv06cP9enTxyH+559/9mv9+vXr5/Y1wbbmQEtvjcqCPqOwGQiGDufPn686NhIERtf7Wxhw+mK9gVnnde54MBUs1PSfMACwDMCfAI4q4koD2AHgF+n7USmeAZgH4FcAhwHUEMJA0AquX7+eFixYQIDxCMDojTxQwoDTXaHgz/UG48ePdyu9GCEEHf0qDF4DUANqYTATQLoUTgcwQwpHA/gEdqFQD8A+IQwEveGnn35Ks2fPVsX17dvX9PXp6el07NgxS+rSt29ft8rW0t1FaP6iEAiFmv5VEwEoD7UwOAagnBQuB+CYFF4CoINeOiEMBK3g2LFjnZ7v1asX9e7dWxV38OBBv9bRlcDwdNMbQUEdBlwYXNWcvyJ9bwHQQBG/E0AtIQwEfclevXo5PW/VyMBdemJI1qOz9Qbp6ekur/fnhjeCfmfQCoOtcBQGNQ3y7AHgG4mBblDBQkSubnElBDjXrl0bsLr6QyBYxQkTJriVfsqUKQF/FgQDLwyEmkjQL9TueJWenu6gBnLFTZs2Bfw+nBmRza5IHj58uOE5MyMEM3RXIAgGnP5dgcwYKw9gCxG9LB3PAnCJiKYzxtIBlCaiEYyxGAD9YDck1wUwj4jqmMjfdSUEQhKLFi1C7969AQAzZszAyJEj0adPHyxcuNB0HtnZ2fj8888BAEuWLEGvXr2wePFi9OrVS7XRDWOMv5w4bIDjTnnO0L9/f90Nc6xYjTxq1ChMmzbNqzx8jVmzZpleQCdgCv7b3AbAagDnAOQCOA0gFUAZ2FVAv0jfpaW0DMA7AI4DOAIT9gIxMhB0hxMmTDA1o6dnz55yWN5z14c0mu5qRG9mFjlba2DWaZ1gkaFYdCYYujRSuRjZEKZNm+b3OnozBdXb1chCIIQUhTAQDD0ePHjQYWqpUgDs2LGD1q1bRwBo1apVtGfPHtqzZw+tX78+YHX2RigICpqgEAaCoceDBw/S5MmTqWfPng6jgFu3bjnw5s2blJmZqVpnoFQfOaO7Rmpv6c5eB/6kMCgHPYULa4HQw++//463334bOTk5WLRokercb7/9hvvuuw8AUK5cOZw7d04+V65cOZ/VqU+fPgCsMzBbiYyMDEyZMiXQ1RDwLfxnQBYjA8FAcs+ePXL44MGDNHXqVLcMtYGgt/UbPHiwQ1xR2B9Z0Ce0bGQg9jMQCGrcvXtXdZybm+sw7bNnz57o2bOnP6vlFHyU0LdvX4+u19vn4K233sKwYcO8rpuAgBGEmkggqLFnzx689tpr8vHo0aNx48YNzJ8/Hz179sSSJUtM5cOFhXKdgRnwNQ5aaNVUztCvXz8sWLDAdHoBATcg1ESCocEdO3Y4xJk1AptNZxV79+7td8OzYMhTzCYSDA1mZmbKYVcb2/fo0SPg9eX0xG4gvJkKekAhDARDg2+//bYcttIxmr9HDYKCPqKYWiogYBbu2BbcBbcpuGNDEBCwEMJmIBg6nDVrlhwePXq0qW0kA6kyctduEKw7oAkWCoqRgUDo4fjx41i2bJnPFlL16tVLdWx2xpGAQAAhRgaCocG33npLDnPXCO4aZ3v06OGzkYKYQSQYYAoDsmDo8bvvviPA7vwtmGYOKSkEg6CfKdREAqGHSZMm4datW7hy5YrHBuHu3bsDAN59912v6qJcxCYQhFD2KMwwVVGAUBMJhhYnT54sh83ufQyAunfv7pf69erVS1Uvb/ckEPSAyo82PtB18x3FyEAgRGDwZKR1T8N7773ncbZ8hKDd9tIsnI0IBg4ciLffftvjugl4AYLjSEAvrujAspGBEAYCwQ0L/txpaWkA4JXwcAY9ldHw4cNRtmxZsd+vvyGEgceIsCITAQF/IT09HdMx3a1rlEIgNTUVAPD+++97XIcePXoAAJYuXQpALQS4E7zSpUsjNzfX4zIEBPwN4cJaoFDBkw6WCwDALgS8EQSAXQhwQcDBBcTixYvRp08f3LlzB2Fh4u8VFGAwVDcKFECoiQSCG0ZDfA+G/laMCji0owMl+vbti2LFiqFcuXIYOXKk12UJuAELnxdvcP78efztb3/zR1HCZiAQIlD8icePH4/x48c7xHuCbt26AVAbjd9//32kpdkN02lpaboGZWdTUvV8IM2cORMjRozwvKIC7iO07AZiaqlP6OwT6LqFKgk0c+ZM/d8q0HWD/tTVXr160bBhwwhQ+1US9BP1no0geV58QMumlgoDshLO3hzIw+sEvAZjDNOnT0d6erpleaakpIAxhmXLlhmm4dNPldCODJTHPXr0wNKlSxEWFoZHH30UM2bMQE5OjmV1FhDwJVxauBhjTzLGdjHGfmSMfc8YGyjFl2aM7WCM/SJ9PyrFM8bYPMbYr4yxw4yxGr6+Cb+AGVDA5xg+fDhu377tVR5jx44FoHZG50pFqvf2xKepcigFBrcfhIWF4c8//8TIkSMxZswYr+otYBGEEdk1TKhwygGoIYUfAvAzgMoAZgJIl+LTAcyQwtEAPoG9+esB2Fdo1ERWDUkFfdq+Y8eOddruI0aMcIgbPXo0AXa/RlbWLy0tTVYVBau/pJCj0bNRNP+rlqmJXI4MiOgcER2QwjcA/AjgcQAtAayQkq0A0EoKtwTwAdmxF8AjjLFyrsoJFqxevTrQVRBwgUmTJgGAg2E2IyMDGRkZKF68uCp+xowZKFGiBAYPHoz8/HwkJyd7XYe0tDTZ2KxVHfXs2RMTJkzAjBkzvC5HwAP4eRSwYMEC/xXmQ7hlM2CMlQdQHcA+AH8lonOAXWAwxspKyR4HcEpx2Wkp7py3lfUHHnnkkUBXQUCBPy/+ibJUVqWSy8jIwBRMUc3jHzFihO4+B1OnTkV+fj7CwsJQrFgx3LlzB8uXL/e6XtrVzGlpabKaqEyZMsjJyUGxYsWCYjbR6tWr0aFDh4DWISjgI7Vuv379fJOxv+HGjJ8HAXwLoI10fFVz/or0vRVAA0X8TgA1dfLrAeAbiYEeahUMI81+ivbQM2j4559/ejQ7ZMyYMQSAJk2aROPGjaP09HSXZXXr1o1SU1NVdLe+XGU0ZcoUmj59uhw/Z84cWrdunSrtokWLfN5+X3zxRcB/w4AwdP6X/t3PAEAxANsBDFHEHQNQTmFXOCaFlwDooJeuSNkM9ASDoOW8cOECgUDDhw93bH8UdPpachtBeno6jRo1ikaPHk1Dhw4lAJScnOx1vdLS0igtLc3wPC+f88iRIwQUCIAlS5a4VV5WVpYc/uCDD1Tnli9fHvDfyTKK/5O79J/XUmZfebMCwGUiGqSInwXgEhFNZ4ylAyhNRCMYYzEA+sFuSK4LYB4R1XFRhvNKCIQsLly4gKlTp6JEiRKYOXOm6tzQoUNRvHhxTJs2TRWfkZGBnJwc5OfnY+7cuUhPT0deXh4YY7h3757sUZTbDvjiMu23EfRWMHP7AcfkyZNRokQJREREIDw8HAMGDEBmZiYGDZL/Qli2bBlyc3MRERGB1NRUrFq1Cvfu3UNKSorLdvnggw/QtWtXh/idO3fioYceQp06dbB27VokJibqXn/w4EFUq1bNZTl+Be8FxCw9d+C/RWcAGsD+Mx0GcFBiNIAysKuAfpG+S0vpGYB3ABwHcARALRNlBFq6CgYpz58/rzoeNGiQ6njIkCHyAi8ANHLkSJoyZQpt3ryZvv76a/rhhx/kdDyNFSMDTu3ogKuJJk6cSABo9uzZlJmZSQDonXfeIQC0YMEC1ds8jwcK3vKXLVtGAOj999+n9957z7B8o3Nr167VjT9+/DitXr3ar7/hmjVrnKcphCPsTz75JOB1kCi2vRQMDWqFwZAhQ2jgwIEOcQBUQuHf//43nTx5kg4cOKCbb1JSksd1MrInKAXD5MmTadasWTRnzhx6++23VemUnf/SpUt1O2elWsgVuUA4d+4cbd68mb777ju6cuUKbdu2jfbv369rNzh37hxdunSJduzYEbjftxAKAc6iKAyEW0WBoAYRyU7hAGDOnDkOG8dUrVoVADB79mwcOXIEWVlZ+PPPP0FE+OWXX3TzXbFiBZKSkiypI3eAx9VEaWlpuHnzJmw2G4YMGSKrnRYvXgzA7siO18Fms8mrlJcsWSKroMyoijju3bsHANiyZQuqV6+OkydPIicnB9HR0Thy5AiuX7+uSr98+XJcuHABx48fx7PPPov9+/fj999/9/T2PQNpwmSUMDgRFRVlLqHefeoxCCCEgUDQY+nSpfLK31GjRslTNVesWIEVK1bgvvvuAwD88MMPCA8PR926dVG7dm1cu3YNFSpUwO7du3HixAmHfFesWIHk5GQkJycjJSXFVAfcrVs35YjWAdx28OCDD8JmswEABgwYgEWLFsnHfF56UlISIiIikJeXB8C+PsGd3dY4+DXdu3fHk08+icqVK2Pfvn3Yv38/ypUrh5iYGDntggULkJycjCeeeAKlSpXC999/DwB45plnVHl++OGHbteDY/fu3cYnlZ2fs5X8inSHDx/Gvn37PK6P36Ht5Hk42L0YBFpFJNREgs547tw5WrVqldM0ffv2pd9++40Au078jz/+oBMnTsgqomHDhsmrknv06OGVikjLbt26Ubdu3QhQq48mT55MmZmZNH/+fJo3bx4B9plES5cuJcBuN1i4cKF8zJmVlSXbC5T2AOXso3fffVe3Ll9++aXcZt999x3t37+fANDGjRsdbAtLliyh1atX00cffUT79++nPXv2yCqjDz/80PrfUvkB6OOPP9ZPA3W6IkFX9+LdvYo9kAVCA2fPnsXo0aN1F4qNGDECM2fORP/+/REXF4enn34aN2/eBABs374dNWrUwM6dOzFz5kwMGjQIYWFhuHnzprw4jM8mUuatnWGkRFZWlhzmLrCVju5SU1Px/vvvIzU1FU8//TQefPBBEBGKFy8OIsKAAQOQlZWFO3fuIDc3FwMHDsS7774rq8LeffddPPbYY2jVqpVD2UZYsmQJiEjlc8kssrKy5NEQr7cWRrOWTEP5z5aadPny5fqrwEmdrlCC4P5+Cs7OuYZls4mEmkjA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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(bev_map)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
